package mine.code.question.动态规划;

import org.junit.Test;

/**
 * 硬币。给定数量不限的硬币，币值为25分、10分、5分和1分，编写代码计算n分有几种表示法。(结果可能会很大，你需要将结果模上1000000007)
 * <p>
 * 示例1:
 * <p>
 * 输入: n = 5
 * 输出：2
 * 解释: 有两种方式可以凑成总金额:
 * <p>
 * 6=5+1
 * 6=1+1+1+1+1+1+1
 * <p>
 * 5=5
 * 5=1+1+1+1+1
 *
 * @author caijinnan
 * @date 2020/5/26 14:44
 */
public class 硬币 {

    @Test
    public void run() {
        int n = 9;
        System.out.println(waysToChange(n));
    }

    private final int[] coins = {25,10,5,1};

    //dp[i] = dp[i-1]+dp[i-5]+dp[i-10]+dp[i-25]
    public int waysToChange(int n) {
        int[] res = new int[n + 1];
        res[0] = 1;
        for(int coin : coins){
            for(int i = coin;i <= n;i++){
                res[i] = (res[i] + res[i - coin]) % 1000000007;
            }
        }
        return res[n];
    }
}